#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <unistd.h>

//Refere-se ao numero de puntos total
#define NPONTOS 10000000
//Refere-se ao numero de testes para promediar seus resultados
#define NTESTES 1

// Declaracao de tipos
typedef double myfloat_t;
typedef unsigned long integer_t;
typedef unsigned int int_t;

// Metodo sequencial
double metodoMontecarlo(integer_t nPontos)
{
	register integer_t I;
	myfloat_t coord_x,coord_y,radio;
	
	integer_t contDentro=0;

	for(I=0;I<nPontos;++I)
	{
		coord_x=((myfloat_t)rand())/((myfloat_t)RAND_MAX);
		coord_y=((myfloat_t)rand())/((myfloat_t)RAND_MAX);
		
		radio=sqrt(coord_x*coord_x+coord_y*coord_y);
		
		if(radio<=1.0)
			++contDentro;
	}

	return 4.0*((myfloat_t)contDentro/(myfloat_t)nPontos);
}

int main(int argc,char** argv)
{
	integer_t nPontos=NPONTOS;
	int_t nTestes=NTESTES;

	if(argc>=2)
		sscanf(argv[1],"%ld",&nPontos);
	if(argc==3)
		sscanf(argv[2],"%d",&nTestes);

	printf("%ld\t",nPontos);
	
	srand(time(0));
	
	double sumTempos=0.0;
	double sumValores=0.0;
	
	int_t I;
	for(I=0;I<nTestes;++I)
	{
		struct timespec ts1,ts2;
		clock_gettime(CLOCK_REALTIME,&ts1);
		
		sumValores+=metodoMontecarlo(nPontos);

		clock_gettime(CLOCK_REALTIME,&ts2);
		sumTempos+=(float)(1.0*(1.0*ts2.tv_nsec-ts1.tv_nsec*1.0)*1e-9+1.0*ts2.tv_sec-1.0*ts1.tv_sec);
	}
	
	printf("%f\t%f\n",sumTempos/(double)nTestes,sumValores/(double)nTestes);
	
	return 0;
}
